로딩 중이에요... 🐣
01 설정과 모델 구성 | ✅ 편저: 코담 운영자
01-Django REST Framework(DRF) - 설정과 모델 구성
- 설정과 모델 구성🔗 소스 1: bugbytes-io/drf-course-api
🔗 소스 2: braverokmc79/Django_REST_Framework_Series
✅1) 프로젝트 실행 방법 :
Starter Code 디렉토리 복사 후 실행
1. 개요
이번 시리즈에서는 Django에서 가장 인기 있는 API 구축 도구인 Django REST Framework(DRF) 를 처음부터 끝까지 단계별로 다루게 됩니다. 이 영상에서는 DRF의 전반적인 개요와 함께, API에 필요한 기본 모델(Product, Order, OrderItem, User)을 정의합니다.
2. REST API 구성 계획
이번 시리즈에서 만들 API는 다음 기능들을 포함합니다:
- 상품 조회 및 상세 보기
- 상품 생성, 수정, 삭제
- 주문 생성 및 조회
- 사용자 인증 및 권한 설정
강의 전반에서는 다음과 같은 DRF의 핵심 개념들을 다룰 예정입니다:
- Request, Response 객체
- 함수형/제너릭/클래스 기반 뷰
- ViewSet
- Serializer
- 인증(Authentication), 권한(Permission)
- 캐싱, 페이징, 필터링
- 테스트 코드 작성 등
3. 모델 구성 개요
이 API는 총 4개의 주요 모델을 기반으로 구성됩니다:
Product
: 상품Order
: 주문OrderItem
: 상품과 주문 사이의 연결 테이블User
: 사용자 모델(커스텀 User 모델 사용)
아래는 django-extensions
의 graph_models
명령어로 생성한 ERD(Entity Relationship Diagram)입니다. 이 구조를 바탕으로 모델을 생성합니다.
모델 구조
🔶 1. User 모델 (api_models_User
)
-
AbstractUser
를 상속하여 확장된 사용자 모델입니다. -
기본적으로 Django에서 제공하는 인증 필드를 포함합니다.
🔸 주요 필드
필드명 | 필드 타입 | 설명 |
---|---|---|
id |
BigAutoField | 기본 키 (자동 생성) |
username |
CharField | 사용자명 |
email |
EmailField | 이메일 주소 |
password |
CharField | 비밀번호 (해시 처리됨) |
first_name / last_name |
CharField | 이름 / 성 |
is_active , is_staff , is_superuser |
BooleanField | 활성화 여부, 직원 여부, 슈퍼유저 여부 |
last_login |
DateTimeField | 마지막 로그인 시간 |
date_joined |
DateTimeField | 가입일자 |
🔶 2. Product 모델 (api_models_Product
)
- 판매되는 상품 정보를 담고 있는 모델입니다.
🔸 주요 필드
필드명 | 필드 타입 | 설명 |
---|---|---|
id |
BigAutoField | 기본 키 |
name |
CharField | 상품명 |
description |
TextField | 상품 설명 |
image |
ImageField | 상품 이미지 |
price |
DecimalField | 상품 가격 |
stock |
PositiveIntegerField | 재고 수량 |
🔶 3. Order 모델 (api_models_Order
)
- 사용자의 주문 정보를 저장합니다.
🔸 주요 필드
필드명 | 필드 타입 | 설명 |
---|---|---|
order_id |
UUIDField | 주문 식별자 (고유 UUID) |
user |
ForeignKey → User | 주문자 |
created_at |
DateTimeField | 주문 생성 시간 |
status |
CharField | 주문 상태 (예: 결제완료, 배송중 등) |
🔶 4. OrderItem 모델 (api_models_OrderItem
)
- 주문에 포함된 상품 항목들입니다.
🔸 주요 필드
필드명 | 필드 타입 | 설명 |
---|---|---|
id |
BigAutoField | 기본 키 |
order |
ForeignKey → Order | 어떤 주문에 속한 항목인지 |
product |
ForeignKey → Product | 어떤 상품인지 |
quantity |
PositiveIntegerField | 수량 |
🔁 관계 요약
-
User
↔Order
: 1:N 관계 (사용자는 여러 주문 가능) -
Order
↔OrderItem
: 1:N 관계 (주문에는 여러 상품 항목이 있음) -
OrderItem
↔Product
: N:1 관계 (여러 주문 항목이 하나의 상품 참조)
4. 모델 생성 과정
1) User 모델
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
pass
기본 AbstractUser
를 상속받아 향후 확장을 고려한 사용자 모델을 정의합니다.
settings.py
에 다음을 추가해야 합니다:
AUTH_USER_MODEL = 'api.User'
2) Product 모델
class Product(models.Model):
name = models.CharField(max_length=200)
description = models.TextField()
price = models.DecimalField(max_digits=10, decimal_places=2)
stock = models.PositiveIntegerField()
image = models.ImageField(upload_to='products/', blank=True, null=True)
@property
def in_stock(self):
return self.stock > 0
def __str__(self):
return self.name
🛍️ Product
모델은 상품 정보를 저장하는 클래스입니다.
주요 항목:
-
name
: 상품 이름 (문자열, 200자까지) -
description
: 상품 설명 (긴 글 가능) -
price
: 상품 가격 (소수점 포함 금액) -
stock
: 재고 수량 (0 이상 정수) -
image
: 상품 이미지 (선택사항)
추가 기능:
-
in_stock
: 재고가 있으면True
, 없으면False
👉product.in_stock
이렇게 사용 -
__str__
: 객체를 문자열로 출력할 때 상품 이름이 보이게 함
👉 예:print(product)
하면상품명
출력
3) Order 모델
import uuid
class Order(models.Model):
class StatusChoices(models.TextChoices):
PENDING = 'Pending'
CONFIRMED = 'Confirmed'
CANCELLED = 'Cancelled'
order_id = models.UUIDField(primary_key=True, default=uuid.uuid4)
user = models.ForeignKey(User, on_delete=models.CASCADE)
created_at = models.DateTimeField(auto_now_add=True)
status = models.CharField(max_length=10, choices=StatusChoices.choices, default=StatusChoices.PENDING)
products = models.ManyToManyField(Product, through='OrderItem', related_name='orders')
def __str__(self):
return f"Order {self.order_id} by {self.user.username}"
🧾 Order
모델은 주문 정보를 저장하는 클래스입니다.
주요 항목:
-
order_id
: 주문 번호 (UUID 형식, 자동 생성됨) -
user
: 주문한 사용자 (User 모델과 연결됨) -
created_at
: 주문 생성 시간 (자동 저장) -
status
: 주문 상태 (Pending
,Confirmed
,Cancelled
중 하나)
🔗 상품 연결
products
: 주문한 상품들
→OrderItem
이라는 중간 테이블을 통해 연결 (수량 등 추가 정보 가능)
📌 추가 기능
__str__
: 문자열로 출력할 때
👉 예:Order 7c12... by junho
4) OrderItem 모델
class OrderItem(models.Model):
order = models.ForeignKey(Order, on_delete=models.CASCADE,related_name='items')
product = models.ForeignKey(Product, on_delete=models.CASCADE)
quantity = models.PositiveIntegerField()
@property
def item_subtotal(self):
return self.product.price * self.quantity
def __str__(self):
return f"{self.quantity} x {self.product.name} in Order {self.order.order_id}"
🧾 OrderItem
모델: 주문 안의 개별 상품 정보
🔹 필드 설명
-
order
: 어떤 주문인지 (→Order
모델과 연결) -
product
: 어떤 상품인지 (→Product
모델과 연결) -
quantity
: 주문 수량 (양의 정수)
💰 item_subtotal
속성
Python의 @property
는 메서드를 속성처럼 사용할 수 있게 해주는 기능입니다. 즉, 괄호 없이 함수처럼 보이지 않고 변수처럼 접근할 수 있게 해줍니다.
-
이 상품의 소계 금액 계산
-
가격 × 수량
계산해서 반환
예: 티셔츠(₩10,000) 2개 → 20,000원
🖨️ __str__
설명
- 출력 예시:
"2 x 티셔츠 in Order a1b2..."
→ 몇 개의 어떤 상품이 어떤 주문에 포함됐는지 보여줌
📌 요약
이 모델은 "주문 안에 있는 각 상품" + 수량 + 금액 계산을 담당합니다
5. 마이그레이션 적용 및 DB 생성
python manage.py makemigrations
python manage.py migrate
SQLite 데이터베이스에 테이블이 생성되며, Django SQLite Explorer
로 확인 가능합니다.
6. 더미 데이터 삽입 (populate_database 커맨드)
manage.py
에 있는 커스텀 커맨드인 populate_database
를 실행하면 다음과 같은 데이터가 자동 삽입됩니다:
- 테스트 사용자 1명
- 무작위 상품 여러 개
- 무작위 주문 3개
- 각 주문마다 2개의 상품을 포함한
OrderItem
python manage.py populate_db
데이터베이스를 확인하면 각 테이블이 잘 채워져 있고, 상품-주문 간 다대다 관계도 연결되어 있음을 확인할 수 있습니다.
7. ERD 시각화 도구
django-extensions
의 graph_models
명령어를 이용해 ERD를 생성할 수 있습니다:
python manage.py graph_models api > models.dot
생성된 .dot
파일을 Graphviz Online 등에 붙여넣으면 ER 다이어그램을 시각화할 수 있습니다.
8. 마무리 및 다음 강의 예고
이제 모델 구성이 완료되었으며, 다음 영상에서는 DRF의 핵심 기능인 Serializer를 학습합니다. Serializer는 Django 모델/쿼리셋을 JSON으로 직렬화하거나, JSON 데이터를 유효성 검사 후 모델 인스턴스로 변환하는 데 사용됩니다.
다음 학습: DRF에서 Serializer의 개념과 역할 알아보기